"""
问题2完整求解程序 - 严格按照题目流程
使用增强版四阶段求解器 (Enhanced 4-Stage Solver)
"""

import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
from problem2_solver_enhanced import Problem2SolverEnhanced

def main():
    """问题2主求解程序 - 增强版"""
    print("="*80)
    print("🏗️  数学建模竞赛A题 - 问题2求解程序 (增强版)")
    print("📋 目标: 同尺寸定日镜场的优化设计")
    print("⚡ 约束: 年平均输出热功率 ≥ 60MW")
    print("🔬 方法: 四阶段求解流程")
    print("="*80)
    
    # 创建增强版求解器
    try:
        solver = Problem2SolverEnhanced()
    except Exception as e:
        print(f"❌ 求解器初始化失败: {e}")
        return
    
    # 执行完整求解
    try:
        print("\n🚀 开始执行四阶段求解流程...")
        start_time = time.time()
        
        result = solver.solve_problem2()
        total_time = time.time() - start_time
        
        if result is not None:
            print("\n" + "="*80)
            print("🎉 问题2求解成功!")
            print("="*80)
            
            # 输出最优解详情
            display_solution(result, total_time)
            
            # 保存结果到文件
            save_results_to_excel(result, total_time)
            save_results_to_txt(result, total_time)
            
            # 可视化结果
            print("\n📊 生成可视化图表...")
            solver.visualize_result(result)
            
            print("\n✅ 所有结果已保存完成!")
            
        else:
            print("\n❌ 问题2求解失败!")
            print("   可能原因:")
            print("   1. 约束条件过于严格 (功率≥60MW)")
            print("   2. 优化算法收敛失败")
            print("   3. 光学效率计算异常")
            
    except Exception as e:
        print(f"\n💥 求解过程中发生错误: {e}")
        import traceback
        traceback.print_exc()

def display_solution(result, solve_time):
    """显示求解结果"""
    xT, yT, w, h, hm = result['solution']
    power = result['power']
    efficiency = result['efficiency']
    num_mirrors = result['num_mirrors']
    method = result['method']
    
    print(f"📊 最优设计方案详情:")
    print(f"   求解方法: {method}")
    print(f"   求解用时: {solve_time:.1f} 秒")
    print()
    print(f"🏗️ 系统配置:")
    print(f"   吸收塔坐标: ({xT:.3f}, {yT:.3f}) m")
    print(f"   定日镜尺寸: {w:.3f} × {h:.3f} m")
    print(f"   安装高度: {hm:.3f} m")
    print(f"   定日镜数量: {num_mirrors} 面")
    print()
    print(f"⚡ 性能指标:")
    print(f"   年平均输出功率: {power:.3f} MW")
    print(f"   平均光学效率: {efficiency:.4f}")
    print(f"   单位面积功率密度: {power / (np.pi * 350**2) * 1e6:.2f} W/m²")
    print()
    print(f"✅ 约束条件检查:")
    print(f"   功率要求 (≥60MW): {'✅' if power >= 60 else '❌'} ({power:.2f} MW)")
    print(f"   镜面尺寸约束: {'✅' if 2 <= h <= w <= 8 else '❌'} ({w:.2f} × {h:.2f} m)")
    print(f"   安装高度约束: {'✅' if 2 <= hm <= 6 else '❌'} ({hm:.2f} m)")
    print(f"   高度比约束: {'✅' if hm >= h/2 else '❌'} (hm={hm:.2f}, h/2={h/2:.2f})")
    print(f"   塔位置约束: {'✅' if xT**2 + yT**2 <= 350**2 else '❌'} (距离: {(xT**2 + yT**2)**0.5:.2f} m)")

def save_results_to_excel(result, solve_time):
    """保存结果到Excel文件 (按照比赛格式)"""
    xT, yT, w, h, hm = result['solution']
    mirror_positions = result['mirror_positions']
    
    # 创建DataFrame
    data = []
    
    # 第一行：吸收塔信息
    data.append([xT, yT, 0, w, h, xT, yT, 80])  # z坐标为塔高80m
    
    # 后续行：定日镜信息
    for i, (x, y) in enumerate(mirror_positions, 1):
        data.append([xT, yT, i, w, h, x, y, hm])
    
    # 创建DataFrame
    df = pd.DataFrame(data, columns=[
        '吸收塔x坐标 (m)', '吸收塔y坐标 (m)', '定日镜序号',
        '定日镜宽度 (m)', '定日镜高度 (m)',
        '定日镜x坐标 (m)', '定日镜y坐标 (m)', '定日镜z坐标 (m)'
    ])
    
    # 保存到Excel
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"result2_enhanced_{timestamp}.xlsx"
    df.to_excel(filename, index=False)
    
    print(f"💾 Excel结果已保存: {filename}")
    
    # 同时覆盖原始模板文件
    try:
        df.to_excel('result2.xlsx', index=False)
        print(f"💾 结果已更新到: result2.xlsx")
    except:
        print(f"⚠️  无法更新result2.xlsx，请手动复制{filename}")

def save_results_to_txt(result, solve_time):
    """保存详细结果到文本文件"""
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"problem2_detailed_result_{timestamp}.txt"
    
    xT, yT, w, h, hm = result['solution']
    
    with open(filename, 'w', encoding='utf-8') as f:
        f.write("="*80 + "\n")
        f.write("数学建模竞赛A题 - 问题2详细求解结果\n")
        f.write("="*80 + "\n")
        f.write(f"求解时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
        f.write(f"求解用时: {solve_time:.1f} 秒\n")
        f.write(f"求解方法: {result['method']}\n\n")
        
        # 问题描述
        f.write("问题描述:\n")
        f.write("  在满足年平均输出热功率≥60MW的约束下，设计定日镜场的关键参数\n")
        f.write("  (吸收塔位置、定日镜尺寸、安装高度、数目及位置)，\n") 
        f.write("  目标是最大化单位镜面面积年平均输出功率。\n\n")
        
        # 决策变量
        f.write("决策变量:\n")
        f.write(f"  Θ = {{(xT,yT), w, h, hm, N, {{(xi,yi)}}ᴺᵢ₌₁}}\n\n")
        
        # 最优解
        f.write("最优设计方案:\n")
        f.write(f"  吸收塔位置: (xT, yT) = ({xT:.6f}, {yT:.6f}) m\n")
        f.write(f"  定日镜尺寸: w × h = {w:.6f} × {h:.6f} m\n")
        f.write(f"  安装高度: hm = {hm:.6f} m\n")
        f.write(f"  定日镜数量: N = {result['num_mirrors']}\n")
        f.write(f"  总镜面面积: {result['num_mirrors'] * w * h:.2f} m²\n\n")
        
        # 性能指标
        f.write("性能指标:\n")
        f.write(f"  年平均输出功率: Ēyr = {result['power']:.6f} MW\n")
        f.write(f"  平均光学效率: η̄ = {result['efficiency']:.6f}\n")
        f.write(f"  单位镜面面积功率: {result['power'] / (result['num_mirrors'] * w * h) * 1e6:.2f} W/m²\n")
        f.write(f"  单位场地面积功率: {result['power'] / (np.pi * 350**2) * 1e6:.2f} W/m²\n\n")
        
        # 约束条件验证
        f.write("约束条件验证:\n")
        f.write(f"  1. 功率约束: Ēyr ≥ 60 MW\n")
        f.write(f"     实际值: {result['power']:.3f} MW ({'✅ 满足' if result['power'] >= 60 else '❌ 不满足'})\n")
        f.write(f"  2. 尺寸约束: 2 ≤ h ≤ w ≤ 8\n")
        f.write(f"     实际值: h={h:.3f}, w={w:.3f} ({'✅ 满足' if 2 <= h <= w <= 8 else '❌ 不满足'})\n")
        f.write(f"  3. 安装高度约束: 2 ≤ hm ≤ 6, hm ≥ h/2\n")
        f.write(f"     实际值: hm={hm:.3f} ({'✅ 满足' if 2 <= hm <= 6 and hm >= h/2 else '❌ 不满足'})\n")
        f.write(f"  4. 塔位置约束: x²T + y²T ≤ 350²\n")
        f.write(f"     实际值: 距离={np.sqrt(xT**2 + yT**2):.3f} m ({'✅ 满足' if xT**2 + yT**2 <= 350**2 else '❌ 不满足'})\n\n")
        
        # 求解方法说明
        f.write("求解方法说明:\n")
        f.write("  采用四阶段求解流程:\n")
        f.write("  阶段1: 参数化布局生成 (环交错布局)\n")
        f.write("  阶段2: 外层优化 (差分进化算法)\n") 
        f.write("  阶段3: 内层优化 (局部精调与约束修复)\n")
        f.write("  阶段4: 光学效率计算 (复用问题一模块)\n\n")
        
        # 布局参数
        f.write("布局参数:\n")
        f.write(f"  场地半径: {350} m\n")
        f.write(f"  禁区半径: {100} m\n")
        f.write(f"  安全距离: w + 5 = {w + 5:.1f} m\n")
        f.write(f"  布局类型: 环交错布局 (K=8环)\n\n")
        
        f.write("="*80 + "\n")
    
    print(f"💾 详细结果已保存: {filename}")

if __name__ == "__main__":
    main() 